package com.jt.service;

import com.jt.mapper.UserMapper;
import com.jt.pojo.ItemCat;
import com.jt.pojo.User;
import com.jt.vo.PageResult;
import com.jt.vo.SysResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.DigestUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;

import java.util.Date;
import java.util.List;
import java.util.UUID;

@Service
public class UserServiceImpl implements UserService{
    @Autowired
    private UserMapper userMapper;
    @Override
    public List<User> findAll(){
        return userMapper.findAll();
    }

    //根据 u/p查询数据库
    @Override
    public String findUserByUP(User user){
        // 1.将密码加密
        byte[] bytes=user.getPassword().getBytes();
        String md5Pass= DigestUtils.md5DigestAsHex(bytes);
        // 将user的password设置为加密后的密文
        user.setPassword(md5Pass);
        // 2.根据用户名和密文查询数据库
        User userDB=userMapper.findUserByUP(user);
        // 3.判断userDB是否有值，没有数据返回null
        if (userDB ==null){
            return null;
        }
        // 密钥特性：唯一性、迷惑性
        // UID 几乎可以保证唯一性
        return UUID.randomUUID().toString().replace("-","");
    }

    /**
     * 分页Sql:  每页10条
     *      select * from user limit 起始位置,查询条数
     * 第一页:
     *      select * from user limit 0,10  0-9 含头不含尾
     * 第二页:
     *      select * from user limit 10,10
     * 第三页:
     *      select * from user limit 20,10
     * 第N页:
     *      select * from user limit (页数-1)条数,条数
     * @param pageResult
     * @return
     */
    @Override
    public PageResult findUserListByPage(PageResult pageResult) {
        //1.总数
        long total = userMapper.findTotal();
        //2.分页结果
        int size = pageResult.getPageSize();    //条数
        int start = (pageResult.getPageNum()-1) * size; //起始位置
        String query = pageResult.getQuery();   //查询条件
        //查询分页数据
        List<User> userList =
                userMapper.findUserListByPage(start,size,query);
        //将返回值结果进行封装
        return pageResult.setTotal(total).setRows(userList);
    }
    @Override
    public int updateUserByStatus(User user){
        return userMapper.updateUserByStatus(user);
    }

    /**
     * 实现业务数据封装
     * 1.实现
     * 2.
     * 3.
     */
    @Override
    public int saveUser(User user){
        String password=user.getPassword();
        //加密密码
        String MD5pass=DigestUtils.md5DigestAsHex(password.getBytes());
        //获取当前时间
        Date date=new Date();
        //将明文覆盖为密文，并且设定其他状态
        user.setPassword(MD5pass).setStatus(true).setCreated(date).setUpdated(date);
        return userMapper.saveUser(user);
    }
    @Override
    public User getUserById(Integer id){
        return userMapper.getUserById(id);
    }
    @Override
    public int updateUser(User user){
        // 设定修改时间为当前时间
        user.setUpdated(new Date());
        return userMapper.updateUser(user);
    }

    /**
     * Spring的事务控制
     * 解决方案：@Transactional
     * 作用：
     *      1.只拦截运行时异常
     *      2.rollbackFor：指定异常的类型回滚 rollbackFor= RuntimeException.class
     *      3.noRollbackFor：指定异常不回滚  noRollbackFor= RuntimeException.class
     */
    @Transactional
    @Override
    public int deleteUserById(User user){
        return userMapper.deleteUserById(user);
    }
    @Override
    public List<ItemCat> findItemCatList(ItemCat itemCat){
        return userMapper.findItemCatList(itemCat);
    }
}
